package com.lesserpand.springcloudalibabacore.config.rabbitmq.config;

import com.lesserpand.springcloudalibabacore.config.rabbitmq.constant.MqEnum;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author pand
 * 消息交换机配置  可以配置多个
 */
@Configuration
public class ExchangeConfig {

    /**
     * 死信交换器
     *
     * @return
     */
    @Bean
    public DirectExchange deadLetterExchange() {
        DirectExchange deadLetterExchange = new DirectExchange(MqEnum.DEAD_LETTER_EXCHANGE.getValue(), true, false);
        return deadLetterExchange;
    }

    /**
     * 1.定义direct exchange，绑定queueTest
     * 2.durable="true" rabbitmq重启的时候不需要创建新的交换机
     * 3.direct交换器相对来说比较简单，匹配规则为：如果路由键匹配，消息就被投送到相关的队列
     * fanout交换器中没有路由键的概念，他会把消息发送到所有绑定在此交换器上面的队列中。
     * topic交换器你采用模糊匹配路由键的原则进行转发消息到队列中
     * key: queue在该direct-exchange中的key值，当消息发送给direct-exchange中指定key为设置值时，
     * 消息将会转发给queue参数指定的消息队列
     * <p>
     * 下面队列是实际消费交换器，第一次消费交换器
     */
    @Bean
    public DirectExchange firstDirectExchange() {
        DirectExchange firstDirectExchange = new DirectExchange(MqEnum.FIRST_DIRECT_EXCHANGE.getValue(), true, false);
        return firstDirectExchange;
    }

    /**
     * 这个也是实际消费交换器，但是是第二次重新消费的实际消费交换器
     *
     * @return
     */
    @Bean
    public DirectExchange secondDirectExchange() {
        DirectExchange secondDirectExchange = new DirectExchange(MqEnum.SECOND_DIRECT_EXCHANGE.getValue(), true, false);
        return secondDirectExchange;
    }

    /**
     * 模拟抢购入库的交换器
     *
     * @return
     */
    @Bean
    public DirectExchange skillExchange() {
        DirectExchange directExchange = new DirectExchange(MqEnum.SKILL_EXCHANGE.getValue(), true, false);
        return directExchange;
    }

}
